Previous months’ reports




1. Summary

1.1 Summary table

A total of 1,014,897 persons have been reached by EiE activities in 2023, of which 534,492 were boys, 457,692 were girls, 9,959 were men and 12,754 were women. Below is a summary by indicator.


Summary statistics for EIE 5Ws reporting, 31 December 2023

Indicator

Partners1

Counties

December_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

19

18

205,304

665,028

1,201,151

55.37

2. Feeding programmes

10

8

4,640

160,440

784,647

20.45

3. Teaching materials

15

16

503,205

761,247

600,578

126.75

4. Safe water, personal hygiene

8

8

26,360

142,675

784,647

18.18

5. Educators resilience enhancing

24

19

9,177

19,994

6,018

332.24

6. Children resilience enhancing

14

15

29,614

169,435

154,729

109.50

7. Construction and rehabilitation

5

4

21,354

57,287

0

100.00

Total

44

23

248,7352

1,014,8972

2,146,545

47.28

1Only implementing partners

2Only the sum of indicators 1, 2, 5 and 6




1.2 By sex and age


Only Indicator 6, Children benefiting from resilience-enhancing programming, sees a higher proportion of females reached over men.





1.3 By county

50.37% of all beneficiaries reached originate from Turkana, though it only has 14.05% of the targeted population.


IPC data extracted from here.




1.4 Gaps

As the drought response draws to a close, it is necessary to review the allocation of resources i.e. have they been fair and proportional to the needs identified. As mentioned, county-level targets were set in line with the IPC and are considered valid.



Substantial deviation from targets has been observed, including areas such as Turkana where targets have been greatly exceeded:


Gaps between reached and targets

County

Target

Reached

Gap

Gap%

Makueni

201,321

688

200,633

99.66

Mandera

339,483

13,919

325,564

95.90

Garissa

268,844

33,277

235,567

87.62

Wajir

258,474

33,519

224,955

87.03

Baringo

86,322

13,636

72,686

84.20

Kwale

60,767

16,000

44,767

73.67

Marsabit

127,609

36,076

91,533

71.73

Samburu

72,788

27,823

44,965

61.78

Narok

83,337

34,937

48,400

58.08

West Pokot

81,626

39,381

42,245

51.75

Tana River

45,347

25,001

20,346

44.87

Isiolo

30,518

25,188

5,330

17.47

Mombasa

0

99

-99

-100.00

Kilifi

0

27,493

-27,493

-100.00

Taita Taveta

0

45

-45

-100.00

Meru

0

26,104

-26,104

-100.00

Kajiado

0

46,249

-46,249

-100.00

Bungoma

0

6,264

-6,264

-100.00

Homa Bay

0

188,301

-188,301

-100.00

Migori

0

4,473

-4,473

-100.00

Nairobi

0

11,343

-11,343

-100.00

Turkana

237,959

613,943

-375,984

-158.00

2. Progress by indicator


2.1.1 Overall progress


The rate of increase in the number of beneficiaries reached has yet to plateau, with only indicators 2 and 6 seeing slight slowdowns in the number of beneficiaries reached each month.




2.1.2 Reached by indicator




2.2.1 Access to ECD spaces/schools


EiE Indicator 1, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

1. Access ECD spaces/schools

19

18

205,304

665,028

1,201,151

55.37



In December 2023, 205,304 persons were reached by interventions contributing to this indicator, of which 112,894 were boys and 92,410 were girls.





2.2.2 School feeding programmes


EiE Indicator 2, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

2. Feeding programmes

10

8

4,640

160,440

784,647

20.45



In December 2023, 4,640 persons were reached by interventions contributing to this indicator, of which 2,523 were boys and 2,117 were girls.





2.2.3 Teaching and learning materials


EiE Indicator 3, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

3. Teaching materials

15

16

503,205

761,247

600,578

126.75



In December 2023, 503,205 persons were reached by interventions contributing to this indicator, of which 254,223 were boys, 246,993 were girls, 5,988 were men and 4,362 were women.





2.2.4 Safe water, personal hygiene


EiE Indicator 4, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

4. Safe water, personal hygiene

8

8

26,360

142,675

784,647

18.18



In December 2023, 26,360 persons were reached by interventions contributing to this indicator, of which 13,550 were boys and 10,725 and were girls.





2.2.5 Educators trained in resilience enhancing programmes


EiE Indicator 5, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

5. Educators resilience enhancing

24

19

9,177

19,994

6,018

332.24



In December 2023, 9,177 persons were reached by interventions contributing to this indicator, of which 3,496 were men and 5,681 and were women.





2.2.6 Children benefited from resilience enhancing programmes


EiE Indicator 6, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

6. Children resilience enhancing

14

15

29,614

169,435

154,729

109.5



In December 2023, 29,614 persons were reached by interventions contributing to this indicator, of which 18,726 were boys and 10,888 and were girls.





2.2.7 Children benefited from construction and rehabilitation


EiE Indicator 7, as of 31 December 2023

Indicator

Partners

Counties

December_reached

Total_reached

Target

%Target_reached

7. Construction and rehabilitation

5

4

21,354

57,287

0

100


To note: targets have not been set for indicator 7.



In December 2023, 21,354 persons were reached by interventions contributing to this indicator, of which 8,957 were boys and 5,056 and were girls.

This activity has no targets.




3. Partners

3.1 Operational presence of implementing partners



Below is an interactive table which adds detail to the map above, serving additional information for coordination – allowing interested parties to search by county or partner.

The column #Activities refers to the number of Education activities implemented by said partner in each county. Each column can be sorted with the arrows next to each column name. Each column can also be filtered by typing into the search bar below each column name. Only completed activities have been included.

Download the dataset from the table below here.





3.2 Summary by implementing partner

The table below breaks down persons reached by partner.


Summary by implementing partner

implementing_partner

reached1

counties

activities

%total2

Finn Church Aid

1,084,974

5

7

54.90

Windle International

136,897

2

5

6.93

Jesuit Refugee Service

115,782

1

4

5.86

Women Educational Researchers of Kenya

103,880

5

4

5.26

Norwegian Refugee Council

72,090

2

4

3.65

Save the Children

64,437

5

3

3.26

Food for the Hungry

63,791

2

7

3.23

Lifeskills Promoters

62,311

3

5

3.15

World Vision Kenya

42,313

8

6

2.14

County Director of Education

39,286

14

1

1.99

UNICEF

34,732

2

1

1.76

Feed the Children

28,711

3

1

1.45

Homa Bay County

23,166

1

1

1.17

Lutheran World Federation

22,433

1

3

1.14

We World

20,947

2

1

1.06

AVSI Foundation

9,768

2

3

0.49

Ministry of Education

8,294

2

2

0.42

Special Olympics Kenya

6,753

11

3

0.34

Nawiri Children Development Program

6,652

5

2

0.34

Qatar Charity

4,757

1

1

0.24

Edukans

4,734

1

1

0.24

Action for Sustainable Change

4,160

1

3

0.21

HABIBA International

2,978

1

1

0.15

County Director of Education Marsabit

2,659

1

2

0.13

Mondi

2,197

1

1

0.11

The Girl Child Network

1,050

2

1

0.05

Frontiers Community Development Organization

1,044

1

1

0.05

Tana North and Tana Delta

882

1

1

0.04

Bartabwa

849

1

1

0.04

Evangelizing Sisters of Mary

737

1

4

0.04

County Director of Education Mandera

600

1

2

0.03

Missionary Sisters of the Catechism

585

1

1

0.03

County Director of Education Wajir

409

1

2

0.02

SMB

270

1

1

0.01

MoE, KNATCOM, STEM Impact Centre

260

2

1

0.01

ERIKs Development Partner

249

1

1

0.01

Servants of the Poor

202

1

1

0.01

Dignitas

135

1

1

0.01

MOE/TSC

60

1

1

0.00

Voluntary Service Overseas

42

1

1

0.00

Futebol da Forcaa

20

1

1

0.00

IWS

10

1

2

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators




3.3 Summary by lead_organisation

Summary by lead organisation

lead_organisation

reached1

counties

activities

%total2

Finn Church Aid

879,266

5

6

44.49

UNICEF

642,957

14

6

32.54

Food for the Hungry

63,791

2

7

3.23

Save the Children

54,871

5

3

2.78

World Vision Kenya

53,600

9

6

2.71

Lifeskills Promoters

47,157

3

4

2.39

County Director of Education

41,945

15

1

2.12

Jesuit Refugee Service

37,430

1

4

1.89

Feed the Children

28,711

3

1

1.45

Population Council

23,166

1

1

1.17

We World

20,947

2

1

1.06

Women Educational Researchers of Kenya

20,747

5

1

1.05

Windle International

18,687

1

1

0.95

AVSI Foundation

10,902

5

6

0.55

ChildFund Kenya

7,696

5

2

0.39

Special Olympics Kenya

4,892

11

1

0.25

Qatar Charity

4,757

1

1

0.24

Edukans

4,734

1

1

0.24

Action for Sustainable Change

4,160

1

3

0.21

HABIBA International

2,978

1

1

0.15

UNESCO

1,330

3

3

0.07

Missionary Sisters of the Catechism

500

1

1

0.03

Voluntary Service Overseas

291

2

1

0.01

Dignitas

135

1

1

0.01

SMB

135

1

1

0.01

KENYA NATIONAL COMMISSION FOR UNESCO

115

1

2

0.01

Life Skills Promoters

111

1

2

0.01

MOE/TSC

60

1

1

0.00

Evangelizing Sisters of Mary

35

1

1

0.00

1All indicators as opposed only indicators 1, 2, 5 and 6

2Percentage of reached for all indicators

4. Schools and education level

4.1 Schools

The number of schools reached by school feeding programmes and WASH in schools interventions to-date are:



However, reporting the overall number of schools reached by all EiE interventions is much more challenging.

Whilst all partners working on indicators 2 and 4 submitted the number of schools they were working in, the same is not true for the other indicators. Only indicators 2 and 4 require the reporting of the number of schools.

Additionally, it is not possible to know which of these schools are repeats, since only the number of schools reached per sub-county are reported, not the individual facilites themselves.




5. Reference maps and tables

5.1 Reference maps

IPC data extracted from here.




5.2 Reference table

Download the EiE 5Ws data here

As a refresher for the reference table below, the indicators are:


indicator

indicator 1 # of children and youth accessing ECD spaces/schools in drought affected areas

indicator 2 # of schools/ECD spaces with feeding programmes

indicator 3 # of learners and teachers reached with learning and teaching materials

indicator 3 #of learners reaached and teachers reached with learning and teaching materials

indicator 4 # of school with adequate quantity of safe water for drinking and personal hygiene

indicator 4 # of schools with adequate quantities of safe water for drinking and personal hygiene

indicator 5 # of teachers / educators trained on resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 6 # of children and youth benefiting from resilience enhancing programmes (MHPSS, DRR & Life Skills, etc)

indicator 7 # of children benefitting from child-friendly environment (any construction or rehabilitation)





LS0tDQp0aXRsZTogIktlbnlhIEVkdWNhdGlvbiBpbiBFbWVyZ2VuY2llcyBXb3JraW5nIEdyb3VwIC0tIERyb3VnaHQgNVdzIFJlcG9ydCINCmRhdGU6ICAiMzEgRGVjZW1iZXIgMjAyMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB5ZXMNCiAgICB0aGVtZTogcmVhZGFibGUNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiBubw0KICAgIGNvbGxhcHNlZDogbm8NCmFsd2F5c19hbGxvd19odG1sOiB5ZXMNCnBhcmFtczogDQogIHJlcG9ydF9kYXRlOiAiMzEgRGVjZW1iZXIgMjAyMyINCiAgcmVwb3J0X21vbnRoOiAiRGVjZW1iZXIiDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDUwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rZW55YS1laWUtd2cvZWllX3dnXzV3cy9tYWluL2VpZV93Z19sb2dvLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCg0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShzdHJpbmdpKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KHZpcmlkaXMpDQpsaWJyYXJ5KHBhdGNod29yaykNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGhlcmUpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmxpYnJhcnkoZ2dyZXBlbCkNCmxpYnJhcnkoYW55dGltZSkNCmxpYnJhcnkodGlkeXRleHQpDQoNCg0KdGhlbWVfc2V0KHRoZW1lX2xpZ2h0KCkpDQoNCiMgSW5zdGFsbGF0aW9uIG9mIG1kZXByaXYgcGFja2FnZQ0KIyBpbnN0YWxsIHBhY2thZ2UgZGV2dG9vbHMgaWYgbm90IHlldCBpbnN0YWxsZWQNCiMgICBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpDQoNCiMgaW5zdGFsbCBmYXN0IGZyb20gR2l0SHViIHdpdGhvdXQgdmlnbmV0dGVzIA0KIyAgIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiYS1iZW5pbmkvbWRlcHJpdiIsIGJ1aWxkX3ZpZ25ldHRlcyA9IEZBTFNFDQoNCiMgQWx0ZXJuYXRpdmVseSwgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTogaHR0cHM6Ly9hLWJlbmluaS5naXRodWIuaW8vbWRlcHJpdi8NCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSAxMDApDQoNCmAlb3V0JWAgPC0gTmVnYXRlKGAlaW4lYCkNCg0KIyBmdW5jdGlvbiBmb3IgdHJhbnNwb3NpbmcgZGYNCnRyYW5zcG9zZV9kZiA8LSBmdW5jdGlvbihkZikgew0KICB0X2RmIDwtIGRhdGEudGFibGU6OnRyYW5zcG9zZShkZikNCiAgY29sbmFtZXModF9kZikgPC0gcm93bmFtZXMoZGYpDQogIHJvd25hbWVzKHRfZGYpIDwtIGNvbG5hbWVzKGRmKQ0KICB0X2RmIDwtIHRfZGYgJT4lDQogICAgdGliYmxlOjpyb3duYW1lc190b19jb2x1bW4oLmRhdGEgPSAuKSAlPiUNCiAgICB0aWJibGU6OmFzX3RpYmJsZSguKQ0KICByZXR1cm4odF9kZikNCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiMgbW9kZSBmdW5jdGlvbiANCm1vZGUgPC0gZnVuY3Rpb24oeCkgew0KICB1eCA8LSB1bmlxdWUoeCkNCiAgdXhbd2hpY2gubWF4KHRhYnVsYXRlKG1hdGNoKHgsIHV4KSkpXQ0KfQ0KDQojIEZpeGluZyBkYXRlcw0KbmFtZV90b19kYXRlIDwtIGZ1bmN0aW9uKHgpIHsNCiAgbHVicmlkYXRlOjptZHkoaWZlbHNlKHggJWluJSBjKG1vbnRoLm5hbWUsIG1vbnRoLmFiYiksIHBhc3RlMCh4LCAiLzAxLzIwMjMiKSwgeCkpDQp9DQpgYGANCg0KYGBge3IgZGF0YX0NCiMgUnVuIHRoaXMgaWYgeW91IG5lZWQgdG8NCiMgcm1hcmtkb3duOjpyZW5kZXIoaW5wdXQgPSAiNVdzX2NsZWFuaW5nX3NjcmlwdC5SbWQiKQ0KDQpsb2NhdGlvbnMgPC0gcmVhZF94bHN4KCIuL2RhdGEva2VuX2FkbWluYm91bmRhcmllc190YWJ1bGFyZGF0YS54bHN4IiwgDQogICAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAiQURNMiIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQpzaXRyZXBfdGFibGUgPC0gcmVhZF94bHN4KCIuL2RhdGEvc2l0cmVwX3Jlc3VsdHNfdGFibGUueGxzeCIpICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KDQp0YXJnZXRzIDwtIHJlYWRfY3N2KCIuL2RhdGEvZWllX3RhcmdldHMuY3N2IikNCg0KcGNvZGUxX3NoYXBlIDwtIA0KICBzZjo6c3RfcmVhZCgiLi9kYXRhL2tlbl9hZG1faWViY18yMDE5MTAzMV9zaHAva2VuX2FkbWJuZGFfYWRtMV9pZWJjXzIwMTkxMDMxLnNocCIsIA0KICAgICAgICAgIHF1aWV0ID0gVFJVRSkgJT4lIA0KICBjbGVhbl9uYW1lcygpDQoNCmlwYyA8LSByZWFkX2NzdigiLi9kYXRhL2lwYy5jc3YiKQ0KDQpwYXJ0bmVyX2xpc3RfY291bnRpZXMgPC0gcmVhZF9jc3YoIi4vZGF0YS9wYXJ0bmVyX2xpc3RfY291bnRpZXMuY3N2IikgJT4lIA0KICBmaWx0ZXIocGFydG5lcl90eXBlID09ICJpbXBsZW1lbnRpbmdfcGFydG5lciIpDQoNCmVpZSA8LSByZWFkX2NzdigiLi9kYXRhL2VpZV81d3MuY3N2IikgJT4lIA0KICAjIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYm95cyA9IDAsIGdpcmxzID0gMCwgbWVuID0gMCwgd29tZW4gPSAwKSkgJT4lIA0KICAjIFRvdGFsIHJlYWNoZWQgb2YgaW5kaWNhdG9yIDEgaXMgb25seSBib3lzIGFuZCBnaXJscyANCiAgbXV0YXRlKHRvdGFsX3JlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scyBpbiBkcm91Z2h0IGFmZmVjdGVkIGFyZWFzIikgfiANCiAgICAgIGJveXMgKyBnaXJscywNCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUgI3w1LjF8NS4yfDUuMyIpIH4gbWVuICsgd29tZW4sDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3IsICJjaGlsZHJlbiBhbmQgeW91dGggYmVuZWZpdGluZyBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMiKSB+IGJveXMgKyBnaXJscywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiB0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBtdXRhdGUobGVhZF9vcmdhbmlzYXRpb24gPSBpZmVsc2UoaXMubmEobGVhZF9vcmdhbmlzYXRpb24pLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGluZ19wYXJ0bmVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uKSkNCg0KYGBgDQoNCltQcmV2aW91cyBtb250aHMnIHJlcG9ydHNdKGh0dHBzOi8va2VueWEtZWllLXdnLmdpdGh1Yi5pby8pDQoNCjxicj48YnI+PGJyPg0KDQojIDEuIFN1bW1hcnkNCg0KIyMgMS4xIFN1bW1hcnkgdGFibGUNCg0KYGBge3J9DQpzdW1fc3RhdHMgPC0gZWllICU+JSAgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChjb3VudHkpLCANCiAgICAgICAgICAgIHJlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgbWVuID0gc3VtKG1lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NSIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB3b21lbiA9IHN1bSh3b21lbltzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjJ8NSIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBib3lzID0gc3VtKGJveXNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NiIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgcmVhY2hlZF8xMjU2ID0gc3VtKHRvdGFsX3JlYWNoZWRbc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxfDJ8NXw2IikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW3N0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMXwyfDV8NiIpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIiYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoXSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYS5ybSA9IFRSVUUpKQ0KDQoNCg0KYGBgDQoNCkEgdG90YWwgb2YgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHJlYWNoZWRfMTI1NikgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgaGF2ZSBiZWVuIHJlYWNoZWQgYnkgRWlFIGFjdGl2aXRpZXMgaW4gMjAyMywgb2Ygd2hpY2ggYHIgc3VtX3N0YXRzICU+JSBwdWxsKGJveXMpICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChnaXJscykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMsIGByIHN1bV9zdGF0cyAlPiUgcHVsbChtZW4pICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIG1lbiBhbmQgYHIgc3VtX3N0YXRzICU+JSBwdWxsKHdvbWVuKSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4gQmVsb3cgaXMgYSBzdW1tYXJ5IGJ5IGluZGljYXRvci4NCg0KPGJyPg0KDQpgYGB7cn0NCg0KDQpzdW1tYXJ5X3RhYmxlIDwtIGVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCwgdG90YWxfcmVhY2hlZCwgTkFfaW50ZWdlcl8pKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2UocGFydG5lcnMgPSBuX2Rpc3RpbmN0KGltcGxlbWVudGluZ19wYXJ0bmVyKSwgDQogICAgICAgICAgICBjb3VudGllcyA9IG5fZGlzdGluY3QoYWRtMV9wY29kZSksICAgDQogICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCA9IHN1bShsYXRlc3RfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICB0b3RhbF9yZWFjaGVkID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciLCwsLCBsYXRlc3RfcmVhY2hlZCwgdG90YWxfcmVhY2hlZCkgJT4lIA0KICBtdXRhdGUocGFydG5lcnMgPSBpZmVsc2UoaW5kaWNhdG9yX3Nob3J0ID09ICJUb3RhbCIsIHN1bV9zdGF0cyRwYXJ0bmVycywgcGFydG5lcnMpLCANCiAgICAgICAgIGNvdW50aWVzID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCBzdW1fc3RhdHMkY291bnRpZXMsIGNvdW50aWVzKSwgDQogICAgICAgICB0b3RhbF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3N0YXRzJHJlYWNoZWRfMTI1NiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQpLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGF0cyRsYXRlc3RfcmVhY2hlZCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRlc3RfcmVhY2hlZCkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIodGFyZ2V0X3VuaXQgPT0gInBlb3BsZSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UodGFyZ2V0ID0gc3VtKGNvdW50eV90YXJnZXQpKSwgDQogICAgICAgICAgICBieSA9ICJpbmRpY2F0b3Jfc2hvcnQiKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBtdXRhdGUodGFyZ2V0ID0gaWZlbHNlKGluZGljYXRvcl9zaG9ydCA9PSAiVG90YWwiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRzICU+JSBkaXN0aW5jdChjb3VudHksIGNvdW50eV9vdmVyYWxsX3RhcmdldCkgJT4lIHtzdW0oLiRjb3VudHlfb3ZlcmFsbF90YXJnZXQpfSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KSwgDQogICAgICAgICB0YXJnZXQgPSBpZmVsc2UoaXMubmEodGFyZ2V0KSwgMCwgdGFyZ2V0KSkgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZCh0b3RhbF9yZWFjaGVkIC8gdGFyZ2V0ICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBwYyA9IGlmZWxzZShpcy5pbmZpbml0ZShwYyksIDEwMCwgcGMpKSAlPiUNCiAgc2VsZWN0KGluZGljYXRvciA9IGluZGljYXRvcl9zaG9ydCwgcGFydG5lcnMsIGNvdW50aWVzLCANCiAgICAgICAgIGxhdGVzdF9yZWFjaGVkLCB0b3RhbF9yZWFjaGVkLCB0YXJnZXQsIGAldGFyZ2V0X3JlYWNoZWRgID0gcGMpICU+JQ0KICBzZWxlY3RfYWxsKH4gZ3N1YigibGF0ZXN0IiwgDQogICAgICAgICAgICAgICAgICAgIHBhcmFtcyRyZXBvcnRfbW9udGgsIC4pKSAlPiUNCiAgc2VsZWN0X2FsbCh+IHN0cl90b190aXRsZSguKSkgIA0KDQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJTdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIEVJRSA1V3MgcmVwb3J0aW5nLCAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOTkpICU+JSANCiAgZm9udHNpemUoaSA9IDE6NywgaiA9IDEsIHNpemUgPSA5KSAlPiUgDQogIGZvbnRzaXplKHNpemUgPSA5LCBwYXJ0ID0gImhlYWRlciIpICU+JSANCiAgZm9vdG5vdGUoaSA9IDEsIGogPSAyLCBwYXJ0ID0gImhlYWRlciIsIHJlZl9zeW1ib2xzID0gIjEiLCANCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJPbmx5IGltcGxlbWVudGluZyBwYXJ0bmVycyIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSA4LCBqID0gNDo1LCByZWZfc3ltYm9scyA9ICIyIiwgDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiT25seSB0aGUgc3VtIG9mIGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKQ0KDQogIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjIgQnkgc2V4IGFuZCBhZ2UNCg0KYGBge3J9DQplaWUgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yX3Nob3J0ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobWVuLCB3b21lbiksIH4gaWZlbHNlKHN0cl9kZXRlY3QoaW5kaWNhdG9yLCAiMSIpLCAwLCAuKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHN1bSguLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9yZWFjaGVkID0gYm95cyArIGdpcmxzICsgbWVuICsgd29tZW4sIA0KICAgICAgICAgZmVtYWxlID0gKHdvbWVuICsgZ2lybHMpIC8gdG90YWxfcmVhY2hlZCwgDQogICAgICAgICBtYWxlID0gKGJveXMgKyBtZW4pIC8gdG90YWxfcmVhY2hlZCkgJT4lDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhmZW1hbGUsIG1hbGUpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInNleCIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInBjIikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBwYywgeSA9IGluZGljYXRvcl9zaG9ydCwgZmlsbCA9IHNleCkpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyh4ID0gcGMsIA0KICAgICAgICAgICAgICAgIHkgPSBpbmRpY2F0b3Jfc2hvcnQsIA0KICAgICAgICAgICAgICAgIGxhYmVsID0gcGVyY2VudChwYywgYWNjdXJhY3kgPSAxKSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gLjUpLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJ3aGl0ZSIpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiIzQ0Mzk4MyIsICIjMzViNzc5IikpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlNleCBicmVha2Rvd24gYnkgaW5kaWNhdG9yIikgIA0KDQpgYGANCg0KPGJyPg0KDQpPbmx5IEluZGljYXRvciA2LCBDaGlsZHJlbiBiZW5lZml0aW5nIGZyb20gcmVzaWxpZW5jZS1lbmhhbmNpbmcgcHJvZ3JhbW1pbmcsIHNlZXMgYSBoaWdoZXIgcHJvcG9ydGlvbiBvZiBmZW1hbGVzIHJlYWNoZWQgb3ZlciBtZW4uDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBtdXRhdGVfYXQodmFycyhib3lzLCBnaXJscywgbWVuLCB3b21lbiksIH4gcmVwbGFjZV9uYSguLCAwKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCkgJT4lIA0KICBzdW1tYXJpc2VfYXQodmFycyhtZW4sIHdvbWVuLCBib3lzLCBnaXJscyksIH4gc3VtKC4pKSAlPiUgDQogIGZpbHRlcighaXMubmEoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMobWVuLCB3b21lbiwgYm95cywgZ2lybHMpLCANCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInR5cGUiLCANCiAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJyZWFjaGVkIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IHN0cl90b190aXRsZSh0eXBlKSwgDQogICAgICAgICB0eXBlID0gZmN0X3JlbGV2ZWwodHlwZSwgYygiTWVuIiwgIldvbWVuIiwgIkJveXMiLCAiR2lybHMiKSkpICU+JSANCiAgIyBZb3UncmUganVzdCBmaWx0ZXJpbmcgdGhlbSBvdXQgbWFudWFsbHkNCiAgbXV0YXRlKHJlYWNoZWQgPSBjYXNlX3doZW4oDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI1IikgJiB0eXBlID09ICJCb3lzIiB+IDAsIA0KICAgIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgdHlwZSA9PSAiR2lybHMiIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJNZW4iIH4gMCwgDQogICAgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiB0eXBlID09ICJXb21lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIHR5cGUgPT0gIk1lbiIgfiAwLCANCiAgICBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIHR5cGUgPT0gIldvbWVuIiB+IDAsDQogICAgVFJVRSB+IHJlYWNoZWQNCiAgKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHkgPSB0eXBlLCB4ID0gcmVhY2hlZCwgZmlsbCA9IHR5cGUpKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShyZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBudW1iZXJfZm9ybWF0KHNjYWxlID0gMSAvIDEwMDAsIHN1ZmZpeCA9ICJLIikpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoYmVnaW4gPSAuMiwgZW5kID0gLjkpICsgDQogIGZhY2V0X3dyYXAofiBpbmRpY2F0b3Jfc2hvcnQpICsgDQogIGxhYnMoeCA9ICJQZXJzb25zIHJlYWNoZWQiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlJlYWNoIGRpc2FnZ3JlZ2F0ZWQgYnkgc2V4LCBhZ2UgYW5kIGluZGljYXRvciIpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjMgQnkgY291bnR5DQoNCmBgYHtyfQ0KY3VtX3BjPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShjb3VudHkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbGVmdF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICBkaXN0aW5jdChjb3VudHksIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCksIA0KICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICByZXBsYWNlX25hKGxpc3QodGFyZ2V0ID0gMCkpICU+JSANCiAgbXV0YXRlKHBjX2JlbiA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpLCANCiAgICAgICAgIHBjX3RhcmdldCA9IHJvdW5kKHRhcmdldCAvIHN1bSh0YXJnZXQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGN1bV9wYyA9IGN1bXN1bShwY19iZW4pKQ0KYGBgDQoNCmByIGN1bV9wYyAlPiUgZmlsdGVyKGNvdW50eSA9PSAiVHVya2FuYSIpICU+JSBwdWxsKGN1bV9wYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyByZWFjaGVkIG9yaWdpbmF0ZSBmcm9tIFR1cmthbmEsIHRob3VnaCBpdCBvbmx5IGhhcyBgciBjdW1fcGMgJT4lIGZpbHRlcihjb3VudHkgPT0gIlR1cmthbmEiKSAlPiUgcHVsbChwY190YXJnZXQpYCUgb2YgdGhlIHRhcmdldGVkIHBvcHVsYXRpb24uDQoNCjxicj4NCg0KYGBge3J9DQoNCmVpZSAlPiUgDQogIGdyb3VwX2J5KGFkbTFfcGNvZGUsIGNvdW50eSkgJT4lIA0KICBzdW1tYXJpc2Uoc2VjdG9yX3JlYWNoZWQgPSBzdW0oc2VjdG9yX3JlYWNoZWQsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBsZWZ0X2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSwgdGFyZ2V0ID0gY291bnR5X292ZXJhbGxfdGFyZ2V0KSwgDQogICAgICAgICAgICBieSA9ICJjb3VudHkiKSAlPiUgIA0KICBtdXRhdGUoY291bnR5ID0gZmN0X3Jlb3JkZXIoY291bnR5LCBzZWN0b3JfcmVhY2hlZCkpICU+JSANCiAgZmlsdGVyKHNlY3Rvcl9yZWFjaGVkID4gMCB8IHRhcmdldCA+IDApICU+JSANCiAgbGVmdF9qb2luKGlwYyAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChhZG0xX3Bjb2RlLCBwZXJjZW50X3BoYXNlX3AzKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoc2VjdG9yX3JlYWNoZWQsIHRhcmdldCksIA0KICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAidHlwZSIsIA0KICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIA0KICBtdXRhdGUodHlwZSA9IGlmZWxzZSh0eXBlID09ICJ0YXJnZXQiLCAiQ291bnR5IFRhcmdldCIsICJTZWN0b3IgUmVhY2hlZCIpKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh2YWx1ZSA9IDApKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gdmFsdWUsIA0KICAgICAgICAgICAgIHkgPSBjb3VudHksIA0KICAgICAgICAgICAgIGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9jb2woKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEodmFsdWUpKSwgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEvMTAwMCwgc3VmZml4ID0gIksiKSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IHBlcmNlbnQpICsgDQogIGZhY2V0X2dyaWQofiB0eXBlLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQzMrIiwNCiAgICAgICB4ID0gIlRhcmdldC9yZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICBjYXB0aW9uID0gIkNvbG91cnMgcmVmZXIgdG8gJSBvZiBjb3VudHkgcG9wdWxhdGlvbiBpbiBJUEMgcGhhc2UgMyBvciBhYm92ZS4gSG9tYSBCYXkgd2FzIG5vdCBhc3Nlc3NlZCBhcyBwYXJ0IG9mIHRoZSBJUEMgQ2xhc3NpZmljYXRpb24iLCANCiAgICAgICB0aXRsZSA9ICJDb21wYXJpc29uIGJldHdlZW4gdGFyZ2V0cyBhbmQgcmVhY2hlZCIpICsNCiAgdGhlbWUoIyBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLCANCiAgICAgICAgIyBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCmBgYA0KDQpJUEMgZGF0YSBleHRyYWN0ZWQgZnJvbSBbaGVyZV0oaHR0cHM6Ly93d3cuaXBjaW5mby5vcmcvaXBjLWNvdW50cnktYW5hbHlzaXMvZGV0YWlscy1tYXAvZW4vYy8xMTU2MjEwLz9pc28zPUtFTikuDQoNCjxicj48YnI+PGJyPg0KDQojIyAxLjQgR2Fwcw0KDQpBcyB0aGUgZHJvdWdodCByZXNwb25zZSBkcmF3cyB0byBhIGNsb3NlLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmV2aWV3IHRoZSBhbGxvY2F0aW9uIG9mIHJlc291cmNlcyBpLmUuIGhhdmUgdGhleSBiZWVuIGZhaXIgYW5kIHByb3BvcnRpb25hbCB0byB0aGUgbmVlZHMgaWRlbnRpZmllZC4gQXMgbWVudGlvbmVkLCBjb3VudHktbGV2ZWwgdGFyZ2V0cyB3ZXJlIHNldCBpbiBsaW5lIHdpdGggdGhlIElQQyBhbmQgYXJlIGNvbnNpZGVyZWQgdmFsaWQuDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD03fQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSAgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUoZ2FwID0gdGFyZ2V0IC0gc2VjdG9yX3JlYWNoZWQsIA0KICAgICAgICAgZ2FwX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKGdhcCAvIHRhcmdldCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgICBnYXAgLyB0YXJnZXQpKSAlPiUgIA0KICBtdXRhdGVfYXQodmFycyhzZWN0b3JfcmVhY2hlZCwgdGFyZ2V0LCBnYXAsIGdhcF9wYyksIH4gYXMubnVtZXJpYyguKSkgJT4lIA0KICByaWdodF9qb2luKHBjb2RlMV9zaGFwZSwgDQogICAgICAgICAgICAgYnkgPSAiYWRtMV9wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIG11dGF0ZShsYWJlbCA9IHBhc3RlMChjb21tYShnYXApLCAiXG4iLCBwZXJjZW50KGdhcF9wYykpLCANCiAgICAgICAgIGxhYmVsID0gaWZlbHNlKHN0cl9kZXRlY3QobGFiZWwsICJOQSIpLCAiIiwgbGFiZWwpKSAlPiUgDQogIGdncGxvdCgpICsgDQogIGdlb21fc2Yoc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyZXk3MCIsIA0KICAgICAgICAgIGFlcyhmaWxsID0gZ2FwX3BjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGxhYmVsKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTUwIiwgc2l6ZSA9IDIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsIA0KICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gInR1cmJvIiwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4zLCANCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTEsIC0uNSwgMCwgLjUsIC45OSkpICsgDQogIHRoZW1lX3ZvaWQoKSArIA0KICBsYWJzKHRpdGxlID0gIkdhcHMgaW4gRHJvdWdodCBSZXNwb25zZSIsDQogICAgICAgc3VidGl0bGUgPSAiSW4gdGVybXMgb2YgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgYW5kICUgb2YgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIkdhcCAlIikNCiAgDQogIA0KYGBgDQoNCjxicj4NCg0KU3Vic3RhbnRpYWwgZGV2aWF0aW9uIGZyb20gdGFyZ2V0cyBoYXMgYmVlbiBvYnNlcnZlZCwgaW5jbHVkaW5nIGFyZWFzIHN1Y2ggYXMgVHVya2FuYSB3aGVyZSB0YXJnZXRzIGhhdmUgYmVlbiBncmVhdGx5IGV4Y2VlZGVkOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIGxlZnRfam9pbih0YXJnZXRzICU+JSANCiAgICAgICAgICAgICAgZGlzdGluY3QoY291bnR5LCB0YXJnZXQgPSBjb3VudHlfb3ZlcmFsbF90YXJnZXQpLCANCiAgICAgICAgICAgIGJ5ID0gImNvdW50eSIpICU+JSAgDQogIGZpbHRlcihzZWN0b3JfcmVhY2hlZCA+IDAgfCB0YXJnZXQgPiAwKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdCh0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUoZ2FwID0gdGFyZ2V0IC0gc2VjdG9yX3JlYWNoZWQsIA0KICAgICAgICAgZ2FwX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKGdhcCAvIHRhcmdldCAqIDEwMCksIA0KICAgICAgICAgICAgICAgICAgICAgICAgIC0xMDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kKGdhcCAvIHRhcmdldCAqIDEwMCwgZGlnaXRzID0gMikpKSAlPiUgDQogIHNlbGVjdChDb3VudHkgPSBjb3VudHksIA0KICAgICAgICAgVGFyZ2V0ID0gdGFyZ2V0LA0KICAgICAgICAgUmVhY2hlZCA9IHNlY3Rvcl9yZWFjaGVkLCANCiAgICAgICAgIEdhcCA9IGdhcCwgDQogICAgICAgICBgR2FwJWAgPSBnYXBfcGMpICU+JSANCiAgYXJyYW5nZShkZXNjKGBHYXAlYCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC43KSAlPiUgDQogIHNldF9jYXB0aW9uKCJHYXBzIGJldHdlZW4gcmVhY2hlZCBhbmQgdGFyZ2V0cyIpDQpgYGANCg0KIyAyLiBQcm9ncmVzcyBieSBpbmRpY2F0b3INCg0KPGJyPg0KDQojIyAyLjEuMSBPdmVyYWxsIHByb2dyZXNzDQoNCmBgYHtyIGZpZy5oZWlnaHQ9Nn0NCg0KbGluZV92YWx1ZXMgPC0gZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkNCg0KDQplaWUgJT4lIA0KICBmaWx0ZXIoYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUgDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBncm91cF9ieShkYXRlLCBpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgc3RhdF9zbW9vdGgoZ2VvbSA9ICJsaW5lIiwgYXBoYSA9IC4zLCBzcGFuID0gLjUpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gY29tbWEoYmVuZWZpY2lhcmllcykpLCANCiAgICAgICAgICAgIHggPSAtSW5mLCB5ID0gSW5mLCBoanVzdCA9IC0wLjE1LCB2anVzdCA9IDAuOSwgZGF0YSA9IGxpbmVfdmFsdWVzKSArIA0KICBzY2FsZV94X2RhdGUoZGF0ZV9icmVha3MgPSAiMSBtb250aCIsIGRhdGVfbGFiZWxzID0gIiViIikgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArIA0KICBmYWNldF93cmFwKH5pbmRpY2F0b3Jfc2hvcnQsIHNjYWxlcyA9ICJmcmVlX3kiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBhbmdsZSA9IDYwLCBoanVzdCA9IDEsIHZqdXN0ID0gMSksIA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSwgDQogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgbGFicyh4ID0gIiIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBpbnRlcnZlbnRpb25zIiwgDQogICAgICAgdGl0bGUgPSBwYXN0ZTAoIk1vbnRobHkgcHJvZ3Jlc3MgYnkgYWN0aXZpdHksICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSksDQogICAgICAgc3VidGl0bGUgPSAiSW5kaWNhdG9yIHN1YnRvdGFsIGluIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgZWFjaCBmYWNldCIpIA0KICANCg0KDQpgYGANCg0KPGJyPg0KDQpUaGUgcmF0ZSBvZiBpbmNyZWFzZSBpbiB0aGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBoYXMgeWV0IHRvIHBsYXRlYXUsIHdpdGggb25seSBpbmRpY2F0b3JzIDIgYW5kIDYgc2VlaW5nIHNsaWdodCBzbG93ZG93bnMgaW4gdGhlIG51bWJlciBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgZWFjaCBtb250aC4NCg0KPGJyPjxicj48YnI+DQoNCiMjIDIuMS4yIFJlYWNoZWQgYnkgaW5kaWNhdG9yDQoNCg0KYGBge3J9DQplaWUgJT4lIA0KICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQpICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZWFjaGVkLCB5ID0gZmN0X3JldihpbmRpY2F0b3Jfc2hvcnQpKSkgKyANCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBpbmRpY2F0b3Jfc2hvcnQpKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfZChvcHRpb24gPSAicGxhc21hIiwgDQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLCANCiAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gLjgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShyZWFjaGVkKSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGxhYnMoeCA9IHBhc3RlMCgiVG90YWwgcmVhY2hlZCBhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIlBlcnNvbnMgcmVhY2hlZCBieSBlYWNoIEVpRSBpbmRpY2F0b3IiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCmBgYHtyfQ0KYmVuX3Bsb3QgPC0gZnVuY3Rpb24odGJsKSB7DQogIHRibCAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCAlaW4lIGMoInBlb3BsZSIpKSAlPiUgDQogICAgICAgICAgICAgICAgc2VsZWN0KGNvdW50eSwgaW5kaWNhdG9yX3Nob3J0LCBjb3VudHlfdGFyZ2V0KSwgDQogICAgICAgICAgICAgIGJ5ID0gYygiY291bnR5IiwgImluZGljYXRvcl9zaG9ydCIpKSAlPiUgDQogICAgcmVwbGFjZV9uYShsaXN0KGNvdW50eV90YXJnZXQgPSAwLCANCiAgICAgICAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IDApKSAlPiUgDQogICAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogICAgbXV0YXRlKHBjID0gaWZlbHNlKGNvdW50eV90YXJnZXQgPiAwLCBiZW5lZmljaWFyaWVzIC8gY291bnR5X3RhcmdldCwgMCksIA0KICAgICAgICAgICBjb3VudHkgPSBmY3RfcmVvcmRlcihjb3VudHksIGJlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICAgIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGJlbmVmaWNpYXJpZXMpLCBoanVzdCA9ICJpbndhcmQiKSwgDQogICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgICAgeCA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSANCn0NCg0KcGNfcGxvdCA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieShpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eSkgJT4lIA0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSAgDQogICAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBjb3VudHkpKSArIA0KICAgIGdlb21fY29sKGFlcyhmaWxsID0gcGMpKSArIA0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KHBjLCBhY2N1cmFjeSA9IC4xKSwgaGp1c3QgPSAiaW53YXJkIiksIA0KICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IikgKyANCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gcGVyY2VudCkgKw0KICAgIHNjYWxlX2ZpbGxfdmlyaWRpcyhkaXJlY3Rpb24gPSAtMSwgb3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gcGVyY2VudCwgYmVnaW4gPSAuMikgKyANCiAgICBsYWJzKHRpdGxlID0gIiUgb2YgdGFyZ2V0IHJlYWNoZWQiLCANCiAgICAgICAgIHggPSAiJSByZWFjaGVkIiwgDQogICAgICAgICB5ID0gIiIsIA0KICAgICAgICAgZmlsbCA9ICIlIHJlYWNoZWQiKSArDQogICAgDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KfQ0KYGBgDQoNCmBgYHtyfQ0KdGFyZ2V0c19yYW5nZSA8LSB0YXJnZXRzICU+JSANCiAgZmlsdGVyKHRhcmdldF91bml0ID09ICJwZW9wbGUiKSAlPiUgDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZSh0YXJnZXQgPSBzdW0oY291bnR5X3RhcmdldCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW5kaWNhdG9yX3Nob3J0LCB2YWx1ZXNfZnJvbSA9IHRhcmdldCkgJT4lIA0KICBzZXROYW1lcyhjKCJjb3VudHkiLCAiaW5kaWNhdG9yMSIsICJpbmRpY2F0b3IyIiwgImluZGljYXRvcjMiLCAiaW5kaWNhdG9yNCIsIA0KICAgICAgICAgICAgICJpbmRpY2F0b3I1IiwgImluZGljYXRvcjYiKSkgJT4lIA0KICBtdXRhdGUoaW5kaWNhdG9yNyA9IDApDQoNCmluZGljYXRvcl9tYXAgPC0gZnVuY3Rpb24odGJsLCBpbmRpY2F0b3JfbnVtYmVyLCBwbG90X29wdGlvbikgew0KICANCiAgcGxvdF9vcHRpb24gPC0gZW5xdW8ocGxvdF9vcHRpb24pDQogIGluZGljYXRvcl9udW1iZXIgPC0gZW5xdW8oaW5kaWNhdG9yX251bWJlcikNCiAgDQogIHRibCAlPiUgDQogICAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAhIWluZGljYXRvcl9udW1iZXIpKSAlPiUgDQogICAgZ3JvdXBfYnkoaW5kaWNhdG9yX3Nob3J0LCBjb3VudHkpICU+JSANCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogICAgZnVsbF9qb2luKHRhcmdldHMgJT4lIA0KICAgICAgICAgICAgICAgIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgISFpbmRpY2F0b3JfbnVtYmVyKSkgJT4lDQogICAgICAgICAgICAgICAgZmlsdGVyKHRhcmdldF91bml0ICVpbiUgYygicGVvcGxlIikpICU+JSANCiAgICAgICAgICAgICAgICBzZWxlY3QoY291bnR5LCBpbmRpY2F0b3Jfc2hvcnQsIGNvdW50eV90YXJnZXQpLCANCiAgICAgICAgICAgICAgYnkgPSBjKCJjb3VudHkiLCAiaW5kaWNhdG9yX3Nob3J0IikpICU+JSANCiAgICByZXBsYWNlX25hKGxpc3QoY291bnR5X3RhcmdldCA9IDAsIA0KICAgICAgICAgICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gMCkpICU+JSANCiAgICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDAgfCBjb3VudHlfdGFyZ2V0ID4gMCkgICU+JSANCiAgICBtdXRhdGUocGMgPSBpZmVsc2UoY291bnR5X3RhcmdldCA+IDAsIGJlbmVmaWNpYXJpZXMgLyBjb3VudHlfdGFyZ2V0LCAwKSwgDQogICAgICAgICAgIGNvdW50eSA9IGZjdF9yZW9yZGVyKGNvdW50eSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgICBuYW5pYXI6OnJlcGxhY2Vfd2l0aF9uYShsaXN0KGJlbmVmaWNpYXJpZXMgPSAwKSkgJT4lIA0KICAgIGxlZnRfam9pbihsb2NhdGlvbnMgJT4lIA0KICAgICAgICAgICAgICAgIGRpc3RpbmN0KGNvdW50eSA9IGFkbTFfZW4sIGFkbTFfcGNvZGUpLCANCiAgICAgICAgICAgICAgYnkgPSAiY291bnR5IikgJT4lIA0KICAgIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCBieSA9IGMoImFkbTFfcGNvZGUiKSkgJT4lDQogICAgc3RfYXNfc2YoKSAlPiUgDQogICAgZ2dwbG90KCkgKyANCiAgICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICAgIGFlcyhmaWxsID0gISFwbG90X29wdGlvbikpICsgDQogICAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKCEhcGxvdF9vcHRpb24pKSwNCiAgICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk0NSIsDQogICAgICAgICAgICAgICAgIHNpemUgPSAyLjUpICsgDQogICAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogICAgdGhlbWVfdm9pZCgpICsgDQogICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IC41KSkNCiAgICANCn0NCg0KYGBgDQoNCiMjIyAyLjIuMSBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiMSIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDEsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkNCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBjb3VudHlfdGFyZ2V0KSArDQogIGxhYnModGl0bGUgPSAiVGFyZ2V0cyIsIA0KICAgICAgIGZpbGwgPSAiVGFyZ2V0IikgICsgDQppbmRpY2F0b3JfbWFwKGVpZSwgIjEiLCBiZW5lZmljaWFyaWVzKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGltaXRzID0gcmFuZ2UodGFyZ2V0c19yYW5nZSRpbmRpY2F0b3IxKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiKSArIA0KICBsYWJzKHRpdGxlID0gIlRvdGFsIHJlYWNoZWQiLCANCiAgICAgICBmaWxsID0gIlJlYWNoZWQiKSArDQogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICIxLiBBY2Nlc3MgdG8gRUNEIHNwYWNlcy9zY2hvb2xzLCB0YXJnZXQgYW5kIHJlYWNoZWQiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUwKCJBcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUpKSANCg0KYGBgDQoNCjxicj4NCg0KSW4gYHIgcGFyYW1zJHJlcG9ydF9tb250aGAgMjAyMywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIxIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kdG90YWxfcmVhY2hlZCwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlcnNvbnMgd2VyZSByZWFjaGVkIGJ5IGludGVydmVudGlvbnMgY29udHJpYnV0aW5nIHRvIHRoaXMgaW5kaWNhdG9yLCBvZiB3aGljaCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRib3lzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBib3lzIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiRnaXJscywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3IgZmlnLmhlaWdodD02fQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjEiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMS4gQ2hpbGRyZW4gYWNjZXNzaW5nIEVDRCBzcGFjZXMvc2Nob29scywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCB0YXJnZXRzIGhhdmUgMCUgcmVhY2hlZCIpDQoNCiANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4yIFNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIyIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMiwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIyIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMi4gU2Nob29sIGZlZWRpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjIiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjIuIEZlZWRpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi4zIFRlYWNoaW5nIGFuZCBsZWFybmluZyBtYXRlcmlhbHMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICIzIikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgMywgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICIzIiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yMyksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiMy4gVGVhY2hpbmcgYW5kIGxlYXJuaW5nIG1hdGVyaWFscywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBnaXJscywgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSBtZW4gYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiMyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHdvbWVuLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgd2VyZSB3b21lbi4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjMiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIzIikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjMuIFRlYWNoaW5nIG1hdGVyaWFscyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgdGFyZ2V0cyBoYXZlIDAlIHJlYWNoZWQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi40IFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI0IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNCwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI0IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNCksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNC4gU2FmZSB3YXRlciwgcGVyc29uYWwgaHlnaWVuZSwgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCiAgDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjQiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNCIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgcGNfcGxvdCgpICsNCg0KZWllICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI0IikpICU+JSANCiAgYmVuX3Bsb3QoKSArDQogIA0KcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjQuIFNhZmUgd2F0ZXIsIHBlcnNvbmFsIGh5Z2llbmUiLCANCiAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9ICJDb3VudGllcyB3aXRob3V0ICUgcmVhY2hlZCBoYXZlIG5vIHRhcmdldCIpDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi41IEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI1IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNSwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI1IiwgY291bnR5X3RhcmdldCkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhuYS52YWx1ZSA9ICJncmV5ODAiLCBsaW1pdHMgPSByYW5nZShjKDAsIDE4MTMpKSkgKyANCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNSIsIGJlbmVmaWNpYXJpZXMpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjUuIEVkdWNhdG9ycyB0cmFpbmVkIGluIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJG1lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgbWVuIGFuZCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjUiKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR3b21lbiwgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGFuZCB3ZXJlIHdvbWVuLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIHBjX3Bsb3QoKSArDQoNCmVpZSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNSIpKSAlPiUgDQogIGJlbl9wbG90KCkgKw0KICANCnBsb3RfYW5ub3RhdGlvbih0aXRsZSA9ICI1LiBFZHVjYXRvcnMgdHJhaW5lZCBpbiByZXNpbGllbmNlIGVuaGFuY2luZyBwcm9ncmFtbWVzIiwgDQogICAgICAgICAgICAgICAgc3VidGl0bGUgPSAiQ291bnRpZXMgd2l0aG91dCAlIHJlYWNoZWQgaGF2ZSBubyB0YXJnZXQiKQ0KDQoNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMjIDIuMi42IENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMNCg0KPGJyPg0KDQpgYGB7cn0NCnN1bW1hcnlfdGFibGUgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChJbmRpY2F0b3IsICI2IikpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICBzZXRfY2FwdGlvbihwYXN0ZTAoIkVpRSBJbmRpY2F0b3IgNiwgYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgJT4lIA0KICBzZXRfdGFibGVfcHJvcGVydGllcyhsYXlvdXQgPSAiYXV0b2ZpdCIsIHdpZHRoID0gLjk5KSANCmBgYA0KDQo8YnI+DQoNCmBgYHtyfQ0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgY291bnR5X3RhcmdldCkgKw0KICBsYWJzKHRpdGxlID0gIlRhcmdldHMiLCANCiAgICAgICBmaWxsID0gIlRhcmdldCIpICArIA0KaW5kaWNhdG9yX21hcChlaWUsICI2IiwgYmVuZWZpY2lhcmllcykgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzKGxpbWl0cyA9IHJhbmdlKHRhcmdldHNfcmFuZ2UkaW5kaWNhdG9yNiksIA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIikgKyANCiAgbGFicyh0aXRsZSA9ICJUb3RhbCByZWFjaGVkIiwgDQogICAgICAgZmlsbCA9ICJSZWFjaGVkIikgKw0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcywgdGFyZ2V0IGFuZCByZWFjaGVkIiwgDQogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiQXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSkgDQoNCmBgYA0KDQo8YnI+DQoNCkluIGByIHBhcmFtcyRyZXBvcnRfbW9udGhgIDIwMjMsIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNiIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJHRvdGFsX3JlYWNoZWQsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBwZXJzb25zIHdlcmUgcmVhY2hlZCBieSBpbnRlcnZlbnRpb25zIGNvbnRyaWJ1dGluZyB0byB0aGlzIGluZGljYXRvciwgb2Ygd2hpY2ggYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kYm95cywgbmEucm0gPSBUUlVFKX0gJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHdlcmUgYm95cyBhbmQgYHIgZWllICU+JSBmaWx0ZXIobW9udGggJWluJSBwYXJhbXMkcmVwb3J0X21vbnRoICYgc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICI2IikgJiBhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSB7c3VtKC4kZ2lybHMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCBhbmQgd2VyZSBnaXJscy4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSkgJT4lIA0KICBwY19wbG90KCkgKw0KDQplaWUgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjYiKSkgJT4lIA0KICBiZW5fcGxvdCgpICsNCiAgDQpwbG90X2Fubm90YXRpb24odGl0bGUgPSAiNi4gQ2hpbGRyZW4gYmVuZWZpdGVkIGZyb20gcmVzaWxpZW5jZSBlbmhhbmNpbmcgcHJvZ3JhbW1lcyIsIA0KICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkNvdW50aWVzIHdpdGhvdXQgJSByZWFjaGVkIGhhdmUgbm8gdGFyZ2V0IikNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyAyLjIuNyBDaGlsZHJlbiBiZW5lZml0ZWQgZnJvbSBjb25zdHJ1Y3Rpb24gYW5kIHJlaGFiaWxpdGF0aW9uDQoNCjxicj4NCg0KYGBge3J9DQpzdW1tYXJ5X3RhYmxlICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoSW5kaWNhdG9yLCAiNyIpKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgc2V0X2NhcHRpb24ocGFzdGUwKCJFaUUgSW5kaWNhdG9yIDcsIGFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpICU+JSANCiAgc2V0X3RhYmxlX3Byb3BlcnRpZXMobGF5b3V0ID0gImF1dG9maXQiLCB3aWR0aCA9IC45OSkgDQpgYGANCg0KPGJyPg0KDQpUbyBub3RlOiB0YXJnZXRzIGhhdmUgbm90IGJlZW4gc2V0IGZvciBpbmRpY2F0b3IgNy4NCg0KPGJyPg0KDQpgYGB7cn0NCmluZGljYXRvcl9tYXAoZWllLCAiNyIsIGNvdW50eV90YXJnZXQpICsNCiAgbGFicyh0aXRsZSA9ICJUYXJnZXRzIiwgDQogICAgICAgZmlsbCA9ICJUYXJnZXQiKSAgKyANCmluZGljYXRvcl9tYXAoZWllLCAiNyIsIGJlbmVmaWNpYXJpZXMpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhsaW1pdHMgPSByYW5nZSh0YXJnZXRzX3JhbmdlJGluZGljYXRvcjYpLCANCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIpICsgDQogIGxhYnModGl0bGUgPSAiVG90YWwgcmVhY2hlZCIsIA0KICAgICAgIGZpbGwgPSAiUmVhY2hlZCIpICsNCiAgcGxvdF9hbm5vdGF0aW9uKHRpdGxlID0gIjcuIENoaWxkcmVuIGJlbmVmaXRlZCBmcm9tIHJlc2lsaWVuY2UgZW5oYW5jaW5nIHByb2dyYW1tZXMsIHRhcmdldCBhbmQgcmVhY2hlZCIsIA0KICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkFzIG9mICIsIHBhcmFtcyRyZXBvcnRfZGF0ZSkpIA0KDQpgYGANCg0KPGJyPg0KDQpJbiBgciBwYXJhbXMkcmVwb3J0X21vbnRoYCAyMDIzLCBgciBlaWUgJT4lIGZpbHRlcihtb250aCAlaW4lIHBhcmFtcyRyZXBvcnRfbW9udGggJiBzdHJfZGV0ZWN0KGluZGljYXRvcl9zaG9ydCwgIjciKSAmIGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIHtzdW0oLiR0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgcGVyc29ucyB3ZXJlIHJlYWNoZWQgYnkgaW50ZXJ2ZW50aW9ucyBjb250cmlidXRpbmcgdG8gdGhpcyBpbmRpY2F0b3IsIG9mIHdoaWNoIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGJveXMsIG5hLnJtID0gVFJVRSl9ICU+JSBmb3JtYXQoYmlnLm1hcmsgPSAiLCIpYCB3ZXJlIGJveXMgYW5kIGByIGVpZSAlPiUgZmlsdGVyKG1vbnRoICVpbiUgcGFyYW1zJHJlcG9ydF9tb250aCAmIHN0cl9kZXRlY3QoaW5kaWNhdG9yX3Nob3J0LCAiNyIpICYgYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiKSAlPiUge3N1bSguJGdpcmxzLCBuYS5ybSA9IFRSVUUpfSAlPiUgZm9ybWF0KGJpZy5tYXJrID0gIiwiKWAgYW5kIHdlcmUgZ2lybHMuDQoNClRoaXMgYWN0aXZpdHkgaGFzIG5vIHRhcmdldHMuDQoNCjxicj48YnI+PGJyPg0KDQojIDMuIFBhcnRuZXJzDQoNCiMjIDMuMSBPcGVyYXRpb25hbCBwcmVzZW5jZSBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMNCg0KPGJyPg0KDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIGZpZy5oZWlnaHQ9N30NCg0KcGFydG5lcl9tYXAgPC0gZWllICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoYm95cywgZ2lybHMsIG1lbiwgd29tZW4pLCB+IHJlcGxhY2VfbmEoLiwgMCkpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSwgY291bnR5KSAlPiUgDQogIHN1bW1hcmlzZShwYXJ0bmVycyA9IG5fZGlzdGluY3QoaW1wbGVtZW50aW5nX3BhcnRuZXIpLCANCiAgICAgICAgICAgIGxlYWRfb3JnYW5pc2F0aW9uID0gbl9kaXN0aW5jdChsZWFkX29yZ2FuaXNhdGlvbiksDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpLCANCiAgICAgICAgICAgIHdvbWVuID0gc3VtKHdvbWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBtZW4gPSBzdW0obWVuW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYm95cyA9IHN1bShib3lzW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgZ2lybHMgPSBzdW0oZ2lybHNbYWN0aXZpdHlfc3RhdHVzID09ICJDb21wbGV0ZWQiXSwgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIHRvdGFsX3JlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUocmVhY2hlZCA9IG1lbiArIHdvbWVuICsgYm95cyArIGdpcmxzLCANCiAgICAgICAgIG1hbGUgPSBtZW4gKyBib3lzLCANCiAgICAgICAgIGZlbWFsZSA9IHdvbWVuICsgZ2lybHMsIA0KICAgICAgICAgbWFsZV9wYyA9IHJvdW5kKG1hbGUgLyByZWFjaGVkICogMTAwKSwgDQogICAgICAgICBmZW1hbGVfcGMgPSByb3VuZChmZW1hbGUgLyByZWFjaGVkICogMTAwKSkgJT4lICANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUNCiAgICAgICAgICAgICAgZGlzdGluY3QoYWRtMV9wY29kZSwgYWNyb255bSkgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbTFfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBhcnJhbmdlKGFjcm9ueW0pICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKGFjcm9ueW0gPSBwYXN0ZTAoYWNyb255bSwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZShhY3JvbnltID0gc3RyX3JlcGxhY2VfYWxsKGFjcm9ueW0sICJDaGlsZEZ1bmQiLCAiQ0YiKSwgDQogICAgICAgICAgICAgICAgICAgICBuX3BhcnRuZXJzID0gc3RyX2NvdW50KGFjcm9ueW0sICIsIikgKyAxKSwgDQogICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBsZWZ0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgZGF0YSA9IHBjb2RlMV9zaGFwZSkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgIGNvbG91ciA9IGFkbTFfcGNvZGUpKSArDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoIA0KICAgIGNvdW50eSwgIlxuIiwgcGFydG5lcnMpLCANCiAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKA0KICAgICAgICAgICAgICAgICJDb3VudHk6ICIsIGNvdW50eSwgIlxuIiwgDQogICAgICAgICAgICAgICAgIlBhcnRuZXJzOiAiLCBuX3BhcnRuZXJzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAiUmVhY2hlZDogIiwgY29tbWEodG90YWxfcmVhY2hlZCksICJcbiIsIA0KICAgICAgICAgICAgICAgICJGZW1hbGVfcmVhY2hlZCU6ICIsIGZlbWFsZV9wYywgIiUsICIsICJNYWxlX3JlYWNoZWQlOiAiLCBtYWxlX3BjLCAiJSIsIA0KICAgICAgICAgICAgICAgICJcbiIsICANCiAgICAgICAgICAgICAgICBhY3JvbnltKSksIA0KICAgICAgICAgICAgICAgIHNpemUgPSAzLCBjb2xvdXIgPSAiZ3JheTQwIikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2Mob3B0aW9uID0gIm1ha28iLCANCiAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IC0xLA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxLCAzLCA2LCAxMCkpICsgDQogIA0KICB0aGVtZV92b2lkKCkgKyANCiAgIyBSZW1lbWJlciB0aGF0IHlvdSBuZWVkIGd1aWRlX2NvbG9yYmFyLCBub3QgZ3VpZGVfbGVnZW5kDQogICMgZ3VpZGVzKGZpbGwgPSBndWlkZV9jb2xvcmJhcihyZXZlcnNlID0gVFJVRSkpICsgDQogIGxhYnModGl0bGUgPSAiRWR1Y2F0aW9uIGluIEVtZXJnZW5jaWVzIFdvcmtpbmcgR3JvdXAgb3BlcmF0aW9uYWwgcHJlc2VuY2UiLCANCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlMCgiYXMgb2YgIiwgcGFyYW1zJHJlcG9ydF9kYXRlKSwgDQogICAgICAgZmlsbCA9ICJQYXJ0bmVycyIpDQoNCg0KZ2dwbG90bHkocGFydG5lcl9tYXAsIHRvb2x0aXAgPSBjKCJ0ZXh0IikpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKHN1bV9zdGF0cyRwYXJ0bmVycywgIiBFaUUgaW1wbGVtZW50aW5nIHBhcnRuZXJzIGFjcm9zcyAiLCBzdW1fc3RhdHMkY291bnRpZXMsICIgY291bnRpZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxzdXA+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcyBvZiAiLCBwYXJhbXMkcmVwb3J0X2RhdGUsICI7IG1vdXNlIG92ZXIgY291bnR5IG5hbWUgZm9yIG1vcmUgZGV0YWlscyIsICI8L3N1cD4iKSkpDQpgYGANCg0KPGJyPg0KDQpCZWxvdyBpcyBhbiBpbnRlcmFjdGl2ZSB0YWJsZSB3aGljaCBhZGRzIGRldGFpbCB0byB0aGUgbWFwIGFib3ZlLCBzZXJ2aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGNvb3JkaW5hdGlvbiAtLSBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc2VhcmNoIGJ5IGNvdW50eSBvciBwYXJ0bmVyLg0KDQpUaGUgY29sdW1uIGAjQWN0aXZpdGllc2AgcmVmZXJzIHRvIHRoZSBudW1iZXIgb2YgRWR1Y2F0aW9uIGFjdGl2aXRpZXMgaW1wbGVtZW50ZWQgYnkgc2FpZCBwYXJ0bmVyIGluIGVhY2ggY291bnR5LiBFYWNoIGNvbHVtbiBjYW4gYmUgc29ydGVkIHdpdGggdGhlIGFycm93cyBuZXh0IHRvIGVhY2ggY29sdW1uIG5hbWUuIEVhY2ggY29sdW1uIGNhbiBhbHNvIGJlIGZpbHRlcmVkIGJ5IHR5cGluZyBpbnRvIHRoZSBzZWFyY2ggYmFyIGJlbG93IGVhY2ggY29sdW1uIG5hbWUuIE9ubHkgY29tcGxldGVkIGFjdGl2aXRpZXMgaGF2ZSBiZWVuIGluY2x1ZGVkLg0KDQpgYGB7cn0NCmVpZSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGxlYWRfb3JnYW5pc2F0aW9uKSwgfiANCiAgICAgICAgICAgICAgc3RyX3N1YiguLCBlbmQgPSA1MEwpKSAlPiUgIA0KICBncm91cF9ieShjb3VudHksIGFkbTFfcGNvZGUsIGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkW2FjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIl0sIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgYWN0aXZpdGllcyA9IG5fZGlzdGluY3QoaW5kaWNhdG9yX3Nob3J0KSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHdyaXRlX2NzdigiLi9kYXRhL2JyZWFrZG93bl9ieV9jb3VudHlfcGFydG5lci5jc3YiKQ0KYGBgDQoNCkRvd25sb2FkIHRoZSBkYXRhc2V0IGZyb20gdGhlIHRhYmxlIGJlbG93IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20va2VueWEtZWllLXdnL2VpZV93Z181d3MvYmxvYi9tYWluL2RhdGEvYnJlYWtkb3duX2J5X2NvdW50eV9wYXJ0bmVyLmNzdikuDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGltcGxlbWVudGluZ19wYXJ0bmVyLCBsZWFkX29yZ2FuaXNhdGlvbiksIH4gDQogICAgICAgICAgICAgIHN0cl9zdWIoLiwgZW5kID0gNTBMKSkgJT4lICANCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgbGVhZF9vcmdhbmlzYXRpb24pICU+JSANCiAgc3VtbWFyaXNlKHJlYWNoZWQgPSBzdW0odG90YWxfcmVhY2hlZFthY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCJdLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGluZGljYXRvcl9zaG9ydCkpICU+JSANCiAgbGVmdF9qb2luKHBhcnRuZXJfbGlzdF9jb3VudGllcyAlPiUgDQogICAgICAgICAgICAgIGRpc3RpbmN0KHBhcnRuZXIsIGFjcm9ueW0pLCANCiAgICAgICAgICAgIGJ5ID0gYygiaW1wbGVtZW50aW5nX3BhcnRuZXIiID0gInBhcnRuZXIiKSkgJT4lIA0KICBzZWxlY3QoY291bnR5LCBsZWFkX29yZ2FuaXNhdGlvbiwgaW1wbGVtZW50aW5nX3BhcnRuZXIsIGFjcm9ueW0sIHJlYWNoZWQsIGAjYWN0aXZpdGllc2AgPSBhY3Rpdml0aWVzLCBhZG0xX3Bjb2RlKSAlPiUgDQogIHNlbGVjdF9hbGwoLiwgfiBzdHJfdG9fdGl0bGUoLikpICU+JSANCiAgZGF0YXRhYmxlKG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLCANCiAgICAgICAgICAgIGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBjYXB0aW9uID0gaHRtbHRvb2xzOjp0YWdzJGNhcHRpb24oc3R5bGUgPSAnY2FwdGlvbi1zaWRlOiB0b3A7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6MTIwJSA7JywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCcmVha2Rvd24gYnkgY291bnR5IGFuZCBwYXJ0bmVyIikpICU+JSANCiAgZm9ybWF0U3R5bGUoMCwgdGFyZ2V0ID0gInJvdyIsIGxpbmVIZWlnaHQgPSAiODAlIiwgZm9udFNpemUgPSAiODAlIikgJT4lIA0KICBmb3JtYXRDdXJyZW5jeShjKCJSZWFjaGVkIiksIA0KICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9ICIiLCBpbnRlcnZhbCA9IDMsIG1hcmsgPSAiLCIpICU+JSANCiAgZm9ybWF0Um91bmQoYygiUmVhY2hlZCIpLCBkaWdpdHMgPSAwKQ0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuMiBTdW1tYXJ5IGJ5IGltcGxlbWVudGluZyBwYXJ0bmVyDQoNClRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biBwZXJzb25zIHJlYWNoZWQgYnkgcGFydG5lci4NCg0KPGJyPg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGltcGxlbWVudGluZ19wYXJ0bmVyID0gc3RyX3N1YihpbXBsZW1lbnRpbmdfcGFydG5lciwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShpbXBsZW1lbnRpbmdfcGFydG5lcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQoNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLjMgU3VtbWFyeSBieSBsZWFkX29yZ2FuaXNhdGlvbg0KDQpgYGB7cn0NCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgbXV0YXRlKGxlYWRfb3JnYW5pc2F0aW9uID0gc3RyX3N1YihsZWFkX29yZ2FuaXNhdGlvbiwgZW5kID0gNTBMKSkgJT4lIA0KICBncm91cF9ieShsZWFkX29yZ2FuaXNhdGlvbikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpLCANCiAgICAgICAgICAgIGNvdW50aWVzID0gbl9kaXN0aW5jdChhZG0xX3Bjb2RlKSwgDQogICAgICAgICAgICBhY3Rpdml0aWVzID0gbl9kaXN0aW5jdChpbmRpY2F0b3Jfc2hvcnQpKSAlPiUgDQogIGZpbHRlcihyZWFjaGVkID4gMCkgJT4lIA0KICBtdXRhdGUoYCV0b3RhbGAgPSByb3VuZChyZWFjaGVkIC8gc3VtKHJlYWNoZWQpICogMTAwLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocmVhY2hlZCkpICU+JSANCiAgZmxleHRhYmxlKCkgJT4lIA0KICB0aGVtZV96ZWJyYSgpICU+JSANCiAgc2V0X2NhcHRpb24oIlN1bW1hcnkgYnkgbGVhZCBvcmdhbmlzYXRpb24iKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKGxheW91dCA9ICJhdXRvZml0Iiwgd2lkdGggPSAuOSkgJT4lIA0KICBmb290bm90ZShpID0gMSwgaiA9IDIsIHJlZl9zeW1ib2xzID0gIjEiLCBwYXJ0ID0gImhlYWRlciIsDQogICAgICAgICAgIGFzX3BhcmFncmFwaCgiQWxsIGluZGljYXRvcnMgYXMgb3Bwb3NlZCBvbmx5IGluZGljYXRvcnMgMSwgMiwgNSBhbmQgNiIpKSAlPiUgDQogIGZvb3Rub3RlKGkgPSAxLCBqID0gNSwgcmVmX3N5bWJvbHMgPSAiMiIsIHBhcnQgPSAiaGVhZGVyIiwNCiAgICAgICAgICAgYXNfcGFyYWdyYXBoKCJQZXJjZW50YWdlIG9mIHJlYWNoZWQgZm9yIGFsbCBpbmRpY2F0b3JzIikpDQogIA0KYGBgDQoNCiMgNC4gU2Nob29scyBhbmQgZWR1Y2F0aW9uIGxldmVsDQoNCiMjIDQuMSBTY2hvb2xzDQoNClRoZSBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IHNjaG9vbCBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyBpbnRlcnZlbnRpb25zIHRvLWRhdGUgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKG51bWJlcl9zY2hvb2xzKSkgJT4lDQogIG11dGF0ZShkYXRlID0gbmFtZV90b19kYXRlKG1vbnRoKSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChpbmRpY2F0b3Jfc2hvcnQsICIyfDQiKSkgJT4lDQogIGdyb3VwX2J5KGluZGljYXRvcl9zaG9ydCwgZGF0ZSkgJT4lIA0KICBzdW1tYXJpc2Uoc2Nob29scyA9IHN1bShudW1iZXJfc2Nob29scyksIA0KICAgICAgICAgICAgcmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkKSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9zY2hvb2xzID0gY3Vtc3VtKHNjaG9vbHMpKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yX3Nob3J0KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGRhdGUsIHkgPSBjdW1fc2Nob29scyksIA0KICAgICAgICAgdmp1c3QgPSAtLjUpICsgDQogIHNjYWxlX3hfZGF0ZShkYXRlX2JyZWFrcyA9ICIxIG1vbnRoIiwgZGF0ZV9sYWJlbHMgPSAiJWIiKSArIA0KICBnZW9tX2xpbmUoc2l6ZSA9IDEuNywgDQogICAgICAgICAgICBhZXMoY29sb3VyID0gaW5kaWNhdG9yX3Nob3J0KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGNvbW1hKGN1bV9zY2hvb2xzKSksIHZqdXN0ID0gLS41KSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzMxNjg4ZSIsICIjZDg1NzZiIikpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsgDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgbnVtYmVyIG9mIHNjaG9vbHMgcmVhY2hlZCIsIA0KICAgICAgIHRpdGxlID0gIlNjaG9vbHMgcmVhY2hlZCBieSBmZWVkaW5nIHByb2dyYW1tZXMgYW5kIFdBU0ggaW4gc2Nob29scyIsIA0KICAgICAgIGNvbG91ciA9ICJJbmRpY2F0b3IiKQ0KDQoNCmBgYA0KDQo8YnI+DQoNCkhvd2V2ZXIsIHJlcG9ydGluZyB0aGUgb3ZlcmFsbCBudW1iZXIgb2Ygc2Nob29scyByZWFjaGVkIGJ5IGFsbCBFaUUgaW50ZXJ2ZW50aW9ucyBpcyBtdWNoIG1vcmUgY2hhbGxlbmdpbmcuDQoNCldoaWxzdCBhbGwgcGFydG5lcnMgd29ya2luZyBvbiBpbmRpY2F0b3JzIDIgYW5kIDQgc3VibWl0dGVkIHRoZSBudW1iZXIgb2Ygc2Nob29scyB0aGV5IHdlcmUgd29ya2luZyBpbiwgdGhlIHNhbWUgaXMgbm90IHRydWUgZm9yIHRoZSBvdGhlciBpbmRpY2F0b3JzLiBPbmx5IGluZGljYXRvcnMgMiBhbmQgNCByZXF1aXJlIHRoZSByZXBvcnRpbmcgb2YgdGhlIG51bWJlciBvZiBzY2hvb2xzLg0KDQpBZGRpdGlvbmFsbHksIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBrbm93IHdoaWNoIG9mIHRoZXNlIHNjaG9vbHMgYXJlIHJlcGVhdHMsIHNpbmNlIG9ubHkgdGhlIG51bWJlciBvZiBzY2hvb2xzIHJlYWNoZWQgcGVyIHN1Yi1jb3VudHkgYXJlIHJlcG9ydGVkLCBub3QgdGhlIGluZGl2aWR1YWwgZmFjaWxpdGVzIHRoZW1zZWx2ZXMuDQoNCjxicj48YnI+PGJyPg0KDQojIDUuIFJlZmVyZW5jZSBtYXBzIGFuZCB0YWJsZXMNCg0KIyMgNS4xIFJlZmVyZW5jZSBtYXBzDQoNCklQQyBkYXRhIGV4dHJhY3RlZCBmcm9tIFtoZXJlXShodHRwczovL3d3dy5pcGNpbmZvLm9yZy9pcGMtY291bnRyeS1hbmFseXNpcy9kZXRhaWxzLW1hcC9lbi9jLzExNTY1NDEvP2lzbzM9S0VOKS4NCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTEwfQ0KaXBjICU+JSANCiAgcmlnaHRfam9pbihwY29kZTFfc2hhcGUsIA0KICAgICAgICAgICAgIGJ5ID0gImFkbTFfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IG51bWJlcl9waGFzZV9wMykpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShudW1iZXJfcGhhc2VfcDMpKSwgDQogICAgICAgICAgICAgICBjb2xvdXIgPSAiZ3JleTQ1IiwgDQogICAgICAgICAgICAgICBzaXplID0gMikgKyANCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImluZmVybm8iLCBiZWdpbiA9IC40LCAsIGRpcmVjdGlvbiA9IC0xKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIkF0IGxlYXN0XG5waGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIHBlcnNvbnMgSVBDIFBoYXNlIDMgb3IgYWJvdmUiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTb3VyY2U6IGh0dHBzOi8vd3d3LmlwY2luZm8ub3JnLyIpICsgDQoNCmlwYyAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBwZXJjZW50X3BoYXNlX3AzKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGVyY2VudF9waGFzZV9wMykpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhsYWJlbHMgPSBwZXJjZW50LCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JleTgwIiwgDQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJpbmZlcm5vIiwgYmVnaW4gPSAuNCwgLCBkaXJlY3Rpb24gPSAtMSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICIlIElQQyBwaGFzZSAzIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBwb3B1bGF0aW9uIElQQyBQaGFzZSAzIG9yIGFib3ZlIiwgDQogICAgICAgc3VidGl0bGUgPSAiU291cmNlOiBodHRwczovL3d3dy5pcGNpbmZvLm9yZy8iKSArDQoNCg0KZWllICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3N0YXR1cyA9PSAiQ29tcGxldGVkIikgJT4lIA0KICBncm91cF9ieShhZG0xX3Bjb2RlKSAlPiUgDQogIHN1bW1hcmlzZShzZWN0b3JfcmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmaWx0ZXIoc2VjdG9yX3JlYWNoZWQgPiAwKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihzaXplID0gLjAxLCBjb2xvdXIgPSAiZ3JleTcwIiwgDQogICAgICAgICAgYWVzKGZpbGwgPSBzZWN0b3JfcmVhY2hlZCkpICsgDQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBjb21tYShzZWN0b3JfcmVhY2hlZCkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmV5ODAiLCANCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9ICJtYWtvIiwgDQogICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSAtMSwgDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yLA0KICAgICAgICAgICAgICAgICAgICAgdHJhbnMgPSAibG9nIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgMzM5NDgzKSkgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIGxhYnMoZmlsbCA9ICJTZWN0b3JcbnJlYWNoZWQiLCANCiAgICAgICB0aXRsZSA9ICJQZXJzb25zIHJlYWNoZWQgYnkgdGhlIEVkdWNhdGlvbiBTZWN0b3IiKSArIA0KICANCmVpZSAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9zdGF0dXMgPT0gIkNvbXBsZXRlZCIpICU+JSANCiAgZ3JvdXBfYnkoYWRtMV9wY29kZSkgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bShzZWN0b3JfcmVhY2hlZCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBmdWxsX2pvaW4odGFyZ2V0cyAlPiUgDQogICAgICAgICAgICAgIGZpbHRlcih0YXJnZXRfdW5pdCA9PSAicGVvcGxlIikgJT4lDQogICAgICAgICAgICAgIGRpc3RpbmN0KGFkbTFfcGNvZGUsIHRhcmdldCA9IGNvdW50eV9vdmVyYWxsX3RhcmdldCkpICU+JSANCiAgcmVwbGFjZV9uYShsaXN0KHJlYWNoZWQgPSAwLCB0YXJnZXQgPSAwKSkgJT4lIA0KICBtdXRhdGUocGMgPSBpZmVsc2UodGFyZ2V0ID09IDAsIDAsIHJlYWNoZWQgLyB0YXJnZXQpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUxX3NoYXBlLCANCiAgICAgICAgICAgICBieSA9ICJhZG0xX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX3NmKHNpemUgPSAuMDEsIGNvbG91ciA9ICJncmV5NzAiLCANCiAgICAgICAgICBhZXMoZmlsbCA9IHBjKSkgKyANCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gMSkpLCANCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJncmV5NDUiLCANCiAgICAgICAgICAgICAgIHNpemUgPSAyKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMobGFiZWxzID0gcGVyY2VudCwgDQogICAgICAgICAgICAgICAgICAgICAgIG5hLnZhbHVlID0gImdyZXk4MCIsDQogICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAibWFrbyIsIA0KICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gLTEsDQogICAgICAgICAgICAgICAgICAgICBiZWdpbiA9IC4yKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyhmaWxsID0gIiUgb2YgdGFyZ2V0IiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBFaUUgY291bnR5IHRhcmdldCByZWFjaGVkIikgKyAgIA0KDQpwbG90X2xheW91dChuY29sID0gMiwgDQogICAgICAgICAgICBucm93ID0gMikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuMiBSZWZlcmVuY2UgdGFibGUNCg0KRG93bmxvYWQgdGhlIEVpRSA1V3MgZGF0YSBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2tlbnlhLWVpZS13Zy9laWVfd2dfNXdzL2Jsb2IvbWFpbi9kYXRhL2VpZV81d3MuY3N2KQ0KDQpBcyBhIHJlZnJlc2hlciBmb3IgdGhlIHJlZmVyZW5jZSB0YWJsZSBiZWxvdywgdGhlIGluZGljYXRvcnMgYXJlOg0KDQo8YnI+DQoNCmBgYHtyfQ0KZWllICU+JSANCiAgZmlsdGVyKCFzdHJfZGV0ZWN0KGluZGljYXRvciwgIjUuMXw1LjJ8NS4zIikpICU+JSANCiAgZGlzdGluY3QoaW5kaWNhdG9yKSAlPiUgDQogIGFycmFuZ2UoaW5kaWNhdG9yKSAlPiUgDQogIGZsZXh0YWJsZSgpICU+JSANCiAgdGhlbWVfemVicmEoKSAlPiUgDQogIHNldF90YWJsZV9wcm9wZXJ0aWVzKHdpZHRoID0gLjg1LCBsYXlvdXQgPSAiYXV0b2ZpdCIpICU+JSANCiAgZm9udHNpemUoaSA9IDE6OSwgaiA9IDEsIHNpemUgPSA5KSANCg0KYGBgDQoNCjxicj4NCg0KYGBge3J9DQplaWUgJT4lDQogIG11dGF0ZShpbXBsZW1lbnRpbmdfcGFydG5lciA9IHN0cl9zdWIoaW1wbGVtZW50aW5nX3BhcnRuZXIsIGVuZCA9IDUwTCksIA0KICAgICAgICAgaW5kaWNhdG9yX251bWJlciA9IHBhcnNlX251bWJlcihpbmRpY2F0b3Jfc2hvcnQpKSAlPiUNCiAgZ3JvdXBfYnkoY291bnR5LCBhZG0xX3Bjb2RlLCBpbXBsZW1lbnRpbmdfcGFydG5lciwgaW5kaWNhdG9yX251bWJlcikgJT4lIA0KICBzdW1tYXJpc2UocmVhY2hlZCA9IHN1bSh0b3RhbF9yZWFjaGVkLCBuYS5ybSA9IFRSVUUpKSAlPiUgDQogIHNlbGVjdChjb3VudHksIGltcGxlbWVudGluZ19wYXJ0bmVyLCBpbmRpY2F0b3IgPSBpbmRpY2F0b3JfbnVtYmVyLCByZWFjaGVkLCBhZG0xX3Bjb2RlKSAlPiUgDQogIGRhdGF0YWJsZShvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwgDQogICAgICAgICAgICBmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gJ2NhcHRpb24tc2lkZTogdG9wOyANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOjEyMCUgOycsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQnJlYWtkb3duIGJ5IGluZGljYXRvciwgY291bnR5IGFuZCBpbXBsZW1lbnRpbmcgcGFydG5lciIpKSAlPiUgDQogIGZvcm1hdFN0eWxlKDAsIHRhcmdldCA9ICJyb3ciLCBsaW5lSGVpZ2h0ID0gIjgwJSIsIGZvbnRTaXplID0gIjgwJSIpICU+JSANCiAgZm9ybWF0Q3VycmVuY3koYygicmVhY2hlZCIpLCANCiAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSAiIiwgaW50ZXJ2YWwgPSAzLCBtYXJrID0gIiwiKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInJlYWNoZWQiKSwgZGlnaXRzID0gMCkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg==